home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / MISC / HCAL-27 / ZOUNDS.BAS (.txt) < prev   
Encoding:
GW-BASIC  |  1997-01-29  |  13.0 KB  |  485 lines

  1. 10  'ZOUNDS - the Zounds of music - 15 OCT 86 rev. 28 SEP 96
  2. 20  IF EX$=""THEN EX$="EXIT"
  3. 30  CLS:KEY OFF
  4. 40  COLOR 7,0,1
  5. 50  DIM W$(12,2)     'frequency chart variables
  6. 60  DIM N$(12)       'names of notes e.g. A,A# etc.
  7. 70  DIM C$(9)        'names of chords
  8. 80  DIM AB$(255,2)   'keyboard variables
  9. 90  DIM X(9)         'fret locations for guitar tuner graphics
  10. 100  DIM Q$(8)        'menu lines for guitar tuner
  11. 110  DIM A$(21)       'keyboard variables
  12. 120  DIM B$(21)       'keyboard variables
  13. 130  D$=" Hz."
  14. 140  Q$="ERROR"      'symbol for flat - chr$(167)
  15. 150  U$="###,###.###"
  16. 160  UL$=STRING$(80,205)
  17. 170  LU$=STRING$(80,"<0xDF!>")
  18. 180  E$=STRING$(80,32)
  19. 190  GOSUB 4520               'load variables from data
  20. 200  LOCATE ,,0  'cursor off
  21. 210  '
  22. 220  '.....mathematical formulae
  23. 230  I=0.5        'Increment for halftone
  24. 240  LF=0.434294 'Log conversion factor to base 10 = 1/log(10)
  25. 250  Z=LOG(I)*LF 'Octave factor (Z= -.3010301)
  26. 260  N=12        '12 notes (halftones) per octave
  27. 270  U=10^(Z/N)  'Halftone increment multiplier (U=.9438742)
  28. 280  A=440       'Standard Pitch in Hz. for middle A
  29. 290  X=A*U^9     'Middle C (Start of Octave 4) 9th note below middle A (261.6254)
  30. 300  Y=A/U^3     'High C   (Start of Octave 5) 3rd note above middle A (523.2512)
  31. 310  SS=335280  'Speed of sound in mm/sec. (1100 ft./sec.,750 m.p.h.)
  32. 320  '
  33. 330  COLOR 15,2
  34. 340  PRINT " THE ZOUNDS OF MUSIC";TAB(57)"by George Murphy VE3ERP ";
  35. 350  COLOR 1,0:PRINT STRING$(80,223);
  36. 360  COLOR 7,0
  37. 370  PRINT " A PROGRAM FOR MUSICIANS, AUDIO ENGINEERS AND CONFIRMED TINKERERS"
  38. 380  PRINT UL$;
  39. 390  PRINT " NOTE: In the following programs the symbol ERROR denotes flat, e.g. ";
  40. 400  PRINT "DERROR,EERROR,GERROR,AERROR,BERROR"
  41. 410  PRINT " for the musical notes D-flat, E-flat, G-flat, A-flat and B-flat."
  42. 420  PRINT
  43. 430  PRINT " Sharps are denoted by the standard # symbol, e.g. C#,D#,F#,G#,A#"
  44. 440  PRINT UL$;
  45. 450  PRINT " Press letter in < > to:"
  46. 460  PRINT UL$;
  47. 470  PRINT "   < a >  Generate audio tones"
  48. 480  PRINT "   < b >  Play a continuous range of audio tones"
  49. 490  PRINT "   < c >  List frequencies of musical tones"
  50. 500  PRINT "   < d >  Calculate fret locations for stringed instruments"
  51. 510  PRINT "   < e >  Analyze a musical tone"
  52. 520  PRINT "   < f >  Analyze an audio frequency or wavelength"
  53. 530  PRINT "   < g >  Analyze chords"
  54. 540  PRINT "   < h >  Tune your guitar"
  55. 550  PRINT "   < i >  Fool around on a Keyboard"
  56. 560  PRINT "   < j >  EXIT"
  57. 570  I$=INKEY$:IF I$=""THEN 570
  58. 580  IF ASC(I$)>=97 AND ASC(I$)<=106 THEN CLS
  59. 590  IF I$="a"THEN 4030
  60. 600  IF I$="b"THEN 3550
  61. 610  IF I$="c"THEN 1780
  62. 620  IF I$="d"THEN 710
  63. 630  IF I$="e"THEN 940
  64. 640  IF I$="f"THEN 1120
  65. 650  IF I$="g"THEN 2660
  66. 660  IF I$="h"THEN 2220
  67. 670  IF I$="i"THEN 3210
  68. 680  IF I$="j"THEN CLS:RUN EX$
  69. 690  GOTO 570
  70. 700  '
  71. 710  '......location of frets
  72. 720  CLS
  73. 730  COLOR 15,2:PRINT " LOCATIONS OF FRETS "
  74. 740  COLOR 1,0:PRINT LU$;
  75. 750  COLOR 7,0
  76. 760  INPUT " ENTER: Length of string (nut to bridge) ..........";L
  77. 770  CLS
  78. 780  W=20
  79. 790  PRINT TAB(20);"NF";SPC(8);"FB"
  80. 800  PRINT UL$;
  81. 810  FOR Z=0 TO W
  82. 820  IF Z=12 THEN COLOR 15,3 ELSE COLOR 7,0
  83. 830  S=L-L*U^Z
  84. 840  IF Z<10 THEN Z$=" "ELSE Z$=""
  85. 850  PRINT " Fret #";Z$;Z;:PRINT USING "######.###";S,L-S;
  86. 860  IF Z=0 THEN LOCATE CSRLIN,12:PRINT "(nut)":LOCATE CSRLIN-1
  87. 870  IF Z=12 THEN PRINT " ....Octave "ELSE PRINT ""
  88. 880  NEXT Z
  89. 890  PRINT UL$;
  90. 900  LOCATE 1,35:PRINT "NF=nut to fret, FB=fret to bridge"
  91. 910  LOCATE 3,35:PRINT "Length of string=";L
  92. 920  GOTO 4480
  93. 930  '
  94. 940  '.....analyze note
  95. 950  CLS
  96. 960  COLOR 15,2:PRINT " ANALYSIS OF A MUSICAL TONE "
  97. 970  COLOR  1,0:PRINT LU$;
  98. 980  COLOR 7,0
  99. 990  K=0:Z=0
  100. 1000  INPUT " ENTER: Note (add - if flat, + if sharp, e.g A-, A+ ) .......";N$
  101. 1010  VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
  102. 1020  Z=ASC(N$):IF Z>96 AND Z<104 THEN MID$(N$,1)=CHR$(Z-32)
  103. 1030  IF RIGHT$(N$,1)="+"THEN N$=LEFT$(N$,1)+"#"
  104. 1040  IF RIGHT$(N$,1)="-"THEN N$=CHR$(ASC(LEFT$(N$,1))-1)+"#"
  105. 1050  IF LEN(N$)=1 THEN N$=N$+" "
  106. 1060  IF N$="@#"THEN N$="G#"
  107. 1070  FOR P=1 TO 12:IF N$=LEFT$(N$(P),2) THEN W=Y*U^(13-P):GOTO 1460 'print table
  108. 1080  NEXT P:BEEP:PRINT " There is no such note as ";N$:GOTO 4480
  109. 1090  NEXT Z
  110. 1100  GOTO 4480     'end
  111. 1110  '
  112. 1120  '.....analyze frequency
  113. 1130  CLS
  114. 1140  COLOR 15,2:PRINT " FREQUENCY ANALYSIS "
  115. 1150  COLOR 1,0:PRINT LU$;
  116. 1160  COLOR 7,0
  117. 1170  PRINT" (Press <ENTER> if you wish to enter wavelength)"
  118. 1180  PRINT
  119. 1190  INPUT " Frequency (Hz.) if known ...";F
  120. 1200  IF F THEN 1260
  121. 1210  VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
  122. 1220  INPUT " Wavelength (mm) in air, if known ...";F
  123. 1230  IF F<>0 THEN F=SS/F
  124. 1240  IF F THEN 1260
  125. 1250  GOTO 1190
  126. 1260  VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
  127. 1270  A=F
  128. 1280  YY=LOG(F/X):ZZ=LOG(2)
  129. 1290  V=INT(YY/ZZ):W=F/2^V:T=X*SQR(U)    'W=HALFTONE, T=QUARTERTONE
  130. 1300  FOR P=12 TO 1 STEP-1
  131. 1310   T=T/U:N$=N$(P)
  132. 1320   IF W>=T THEN 1390
  133. 1330   Z=F:GOSUB 1680
  134. 1340   PRINT TAB(4)" Frequency =";TAB(19)USING U$;Z;:PRINT D$;
  135. 1350   GOSUB 1700:COLOR 0,7:LOCATE CSRLIN,4
  136. 1360   PRINT " Nearest musical tone is highlighted in the table below "
  137. 1370   COLOR 7,0
  138. 1380   GOTO 1420
  139. 1390  NEXT P
  140. 1400  GOTO 1330
  141. 1410  '
  142. 1420  FOR J=1 TO 12:IF N$(J)=N$ THEN W=Y*U^J:GOTO 1460
  143. 1430  NEXT J
  144. 1440  END
  145. 1450  '
  146. 1460  '.......print table
  147. 1470  V=V+1
  148. 1480  Z=W:GOSUB 1680
  149. 1490  PRINT "    Middle ";N$;" =";TAB(19)USING U$;Z;:PRINT D$;:A=W:GOSUB 1700
  150. 1500  LOCATE CSRLIN-1,65:PRINT "( Octave 4 )    ";
  151. 1510  PRINT UL$;
  152. 1520  W=W/2^4:COL=0
  153. 1530  FOR V=-4 TO 12
  154. 1540  IF V<10 THEN  C$=" "ELSE C$=""
  155. 1550  Z1=W*2^V:Z2=W*2^(V+1):Z3=(Z1+Z2)/2
  156. 1560  IF I$="e" AND V=4 THEN COLOR 0,15:GOTO 1600
  157. 1570  IF COL=1 THEN COLOR 0,15:COL=0:GOTO 1600
  158. 1580  IF I$="f"AND F>=Z1 AND F<Z3 THEN COLOR 0,15
  159. 1590  IF I$="f"AND F>Z3 AND F<=Z2 THEN COL=1
  160. 1600  PRINT " Octave";C$;V;N$;" =";TAB(19)USING U$;Z1;:PRINT D$;
  161. 1610  A=Z1:GOSUB 1700
  162. 1620  COLOR 7,0:NEXT V
  163. 1630  PRINT UL$;
  164. 1640  LOCATE 1,41:PRINT "The symbol ERROR denotes flat
  165. 1650  LOCATE 24,1
  166. 1660  GOTO 4480      'end
  167. 1670  '
  168. 1680  IF Z<0.000999999 THEN Z=0:RETURN
  169. 1690  Z=INT(1000*Z+0.5)/1000:RETURN
  170. 1700  R$="m":Z=SS/A:IF Z<0.000999999 THEN 1740
  171. 1710  IF Z>=10 THEN Z=Z/10:R$="c"
  172. 1720  IF Z>=100 THEN Z=Z/100:R$=""
  173. 1730  GOSUB 1680
  174. 1740  PRINT TAB(38)"Wavelength =";USING U$;Z;:PRINT" ";R$;"m ";
  175. 1750  IF V=4 THEN PRINT"(middle octave)"ELSE PRINT ""
  176. 1760  RETURN
  177. 1770  '
  178. 1780  '.....musical scale
  179. 1790  CLS
  180. 1800  COLOR 15,2:PRINT " FREQUENCIES (Hz.) of MUSICAL TONES "
  181. 1810  COLOR 1,0:PRINT LU$;
  182. 1820  COLOR 7,0
  183. 1830  PRINT " The symbol ";:COLOR 15:PRINT "ERROR";:COLOR 7:PRINT " signifies flat.";
  184. 1840  PRINT "   Octave 4 is the range from middle C to middle B";
  185. 1850  PRINT TAB(6)"Frequencies are rounded off. ";
  186. 1860  PRINT "Use other programs for more exact figures.";
  187. 1870  PRINT UL$;
  188. 1880  LOCATE CSRLIN-1,7:PRINT "FN"
  189. 1890  FOR P=1 TO 12
  190. 1900  W$(P,1)=N$(P)
  191. 1910  W$(P,2)=STR$(Y*U^(13-P)/16)
  192. 1920  NEXT P
  193. 1930  PRINT TAB(7);"CALL";TAB(40);"OCTAVE"
  194. 1940  PRINT " Note CALL";TAB(40);"SOUNDSOUNDSOUNDSOUNDSOUNDSOUND"
  195. 1950  PRINT "      CALL";
  196. 1960  FOR Z=-1 TO 10                     'print column headings (octaves)
  197. 1970   COLOR 7,0:IF Z=4 THEN COLOR 15,0
  198. 1980   PRINT USING "######";Z;
  199. 1990  NEXT Z
  200. 2000  PRINT UL$;
  201. 2010  LOCATE CSRLIN-1,7:PRINT "INSTR"
  202. 2020  FOR Z=1 TO 12                               'print rows
  203. 2030   PRINT " ";W$(Z,1);TAB(7);"CALL";              'key
  204. 2040    FOR P=-1 TO 10                            'columns
  205. 2050    Q=VAL(W$(Z,2))*2^P
  206. 2060    IF Q>27.49 AND Q<4186.1 THEN COLOR 15,1 ELSE COLOR 7,0
  207. 2070    IF Q<100 THEN V$="####.#"ELSE V$="######"
  208. 2080    PRINT USING V$;Q;
  209. 2090  '  PLAY"mbo3t255l64ml"
  210. 2100  '  PLAY LEFT$(W$(Z,1),2)
  211. 2110   NEXT P
  212. 2120   PRINT ""
  213. 2130  NEXT Z
  214. 2140  PRINT "      CALL";
  215. 2150  PRINT TAB(14);:COLOR 15,1
  216. 2160  PRINT " Highlighted notes are the notes on a standard 88 key piano."
  217. 2170  COLOR 7,0
  218. 2180  PRINT UL$;
  219. 2190  LOCATE CSRLIN-1,7:PRINT "STEP"
  220. 2200  GOTO 4480
  221. 2210  '
  222. 2220  '.....tune guitar
  223. 2230  CLS
  224. 2240  COLOR 15,2:PRINT " GUITAR TUNER "
  225. 2250  COLOR 1,0:PRINT LU$;
  226. 2260  COLOR 7,0
  227. 2270  PLAY"ml"
  228. 2280  FOR Z=7 TO 17 STEP 2
  229. 2290  LOCATE Z:PRINT TAB(11)STRING$(68,45)
  230. 2300  NEXT Z
  231. 2310  FOR Z=1 TO 9
  232. 2320   FOR Y=7 TO 17
  233. 2330    LOCATE Y,X(Z):PRINT "CSRLIN"                'print frets
  234. 2340   NEXT Y
  235. 2350  NEXT Z
  236. 2360  GOSUB 2380:GOTO 2440
  237. 2370  '
  238. 2380  FOR Z=1 TO 8
  239. 2390  LOCATE(2*Z+5),1
  240. 2400  PRINT " ";Q$(Z);
  241. 2410  NEXT Z
  242. 2420  RETURN
  243. 2430  '
  244. 2440  COLOR 15,3
  245. 2450  LOCATE 4,6:PRINT " Press number in ( ) to tune a string or stop program: "
  246. 2460  COLOR 7,0
  247. 2470  Z$=INKEY$
  248. 2480  Z=VAL (Z$):IF Z<1 OR Z>8 THEN 2470
  249. 2490  LOCATE 4:PRINT E$;
  250. 2500  IF Z=1 THEN M$="o3e"
  251. 2510  IF Z=2 THEN M$="o2b"
  252. 2520  IF Z=3 THEN M$="o2g"
  253. 2530  IF Z=4 THEN M$="o2d"
  254. 2540  IF Z=5 THEN M$="o1a"
  255. 2550  IF Z=6 THEN M$="o1e"
  256. 2560  IF Z=7 THEN 2310
  257. 2570  IF Z=8 THEN 4500
  258. 2580  LOCATE Z*2+5:COLOR 15,0:PRINT " CSRLINCSRLINCSRLIN"
  259. 2590  COLOR 15,3
  260. 2600  LOCATE 4,6:PRINT " Press another number to continue...."
  261. 2610  COLOR 7,0
  262. 2620  PLAY M$
  263. 2630  Z$=INKEY$
  264. 2640  IF Z$=""THEN 2620 ELSE COLOR 7,0:GOSUB 2380:GOTO 2480
  265. 2650  '
  266. 2660  '.....chords
  267. 2670  CLS
  268. 2680  COLOR 15,2:PRINT " CHORD STRUCTURE "
  269. 2690  COLOR 1,0:PRINT LU$;
  270. 2700  COLOR 7,0
  271. 2710  A=0
  272. 2720  PLAY"o2"
  273. 2730  PRINT " Press letter in < > for desired key.....( ERROR denotes flat ):"
  274. 2740  PRINT UL$;
  275. 2750  FOR Z=1 TO 12:PRINT TAB(18);"<";CHR$(Z+103);">  ";N$(Z):NEXT Z
  276. 2760  Z$=INKEY$:IF Z$=""THEN 2760
  277. 2770  Z=ASC(Z$):IF Z<104 OR Z>115 THEN 2760
  278. 2780  VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
  279. 2790  '
  280. 2800  N=Z-103
  281. 2810  PRINT " CHORDS IN THE KEY OF ";N$(N)
  282. 2820  PRINT UL$;
  283. 2830  PRINT " Press number in ( ) for desired chord:"
  284. 2840  PRINT UL$;
  285. 2850  FOR Z=1 TO 9
  286. 2860  CH$(Z)=N$(N)+" "+C$(Z)
  287. 2870  PRINT TAB(17);"(";Z;")  ";CH$(Z)
  288. 2880  NEXT Z
  289. 2890  Z$=INKEY$:X=VAL (Z$):IF X=0 THEN 2890
  290. 2900  VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
  291. 2910  CH$=CH$(X)
  292. 2920  PRINT " The notes in ";CH$;" are.....( ERROR signifies flat ):"
  293. 2930  PRINT UL$;
  294. 2940  IF X=1 THEN A=1:B=5:C=8:D=1 :E=0:P$="ceg>c"     'maj
  295. 2950  IF X=2 THEN A=1:B=5:C=8:D=10:E=1:P$="cega>c"    '6
  296. 2960  IF X=3 THEN A=1:B=5:C=8:D=11:E=1:P$="cegb->c"   '7
  297. 2970  IF Y=13 THEN Z$=STRING$(3,"_")ELSE Z$=STRING$(3," ")
  298. 2980  IF X=4 THEN A=1:B=5:C=8:D=12:E=1:P$="cegb>c"    'maj 7
  299. 2990  IF X=5 THEN A=1:B=4:C=7:D=10:E=1:P$="ce-g-a>c"  'dim
  300. 3000  IF X=6 THEN A=1:B=5:C=9:D=1 :E=0:P$="ceg+>c"    'aug
  301. 3010  IF X=7 THEN A=1:B=4:C=8:D=1 :E=0:P$="ce-g>c"    'min
  302. 3020  IF X=8 THEN A=1:B=4:C=8:D=10:E=1:P$="ce-ga>c"   'min 6
  303. 3030  IF X=9 THEN A=1:B=4:C=8:D=11:E=1:P$="ce-gb->c"  'min 7
  304. 3040  Q(1)=N-1+A:IF Q(1)>12 THEN Q(1)=Q(1)-12
  305. 3050  Q(2)=N-1+B:IF Q(2)>12 THEN Q(2)=Q(2)-12
  306. 3060  Q(3)=N-1+C:IF Q(3)>12 THEN Q(3)=Q(3)-12
  307. 3070  Q(4)=N-1+D:IF Q(4)>12 THEN Q(4)=Q(4)-12
  308. 3080  Q(5)=N-1+E:IF Q(5)>12 THEN Q(5)=Q(5)-12
  309. 3090  IF E=0 THEN Q(5)=0       'triad
  310. 3100  FOR Z=1 TO 5
  311. 3110  COLOR 15,4
  312. 3120  PRINT " ";N$(Q(Z)),
  313. 3130  NEXT Z
  314. 3140  COLOR 7,0:PRINT UL$;
  315. 3150  PRINT " To stop music press any key.
  316. 3160  PRINT " The music will stop when the chord being played is finished."
  317. 3170  PLAY"L4o2":PLAY P$
  318. 3180  IF INKEY$=""THEN 3170
  319. 3190  GOTO 4500
  320. 3200  '
  321. 3210  '.....keyboard
  322. 3220  CLS
  323. 3230  COLOR 15,2:PRINT " ELECTRONIC KEYBOARD "
  324. 3240  COLOR 1,0:PRINT LU$;
  325. 3250  COLOR 7,0
  326. 3260  COLOR 0,7
  327. 3270  RO=5    'row
  328. 3280  CO=16   'column
  329. 3290  LOCATE RO+0,CO:PRINT"CALL  INKEY$CSRLINOFF INKEY$CSRLINOFF  CALL  INKEY$CSRLINOFF INKEY$CSRLINOFF INKEY$CSRLINOFF  CALL  INKEY$CSRLINOFF INKEY$CSRLINOFF  CALL  INKEY$CSRLINOFF INKEY$CSRLIN
  330. 3300  LOCATE RO+1,CO:PRINT"CALL  INKEY$CSRLINOFF INKEY$CSRLINOFF  CALL  INKEY$CSRLINOFF INKEY$CSRLINOFF INKEY$CSRLINOFF  CALL  INKEY$CSRLINOFF INKEY$CSRLINOFF  CALL  INKEY$CSRLINOFF INKEY$CSRLIN
  331. 3310  LOCATE RO+2,CO:PRINT"CALL  INKEY$2OFF INKEY$3OFF  CALL  INKEY$5OFF INKEY$6OFF INKEY$7OFF  CALL  INKEY$9OFF INKEY$0OFF  CALL  INKEY$=OFF INKEY$CSRLIN
  332. 3320  LOCATE RO+3,CO:PRINT"CALL  INKEY$CSRLINOFF INKEY$CSRLINOFF  CALL  INKEY$CSRLINOFF INKEY$CSRLINOFF INKEY$CSRLINOFF  CALL  INKEY$CSRLINOFF INKEY$CSRLINOFF  CALL  INKEY$CSRLINOFF INKEY$CSRLIN
  333. 3330  LOCATE RO+4,CO:PRINT"CALL   CALL   CALL   CALL   CALL   CALL   CALL   CALL   CALL   CALL   CALL   CALL   CALL
  334. 3340  LOCATE RO+5,CO:PRINT"CALL q CALL w CALL e CALL r CALL t CALL y CALL u CALL i CALL o CALL p CALL [ CALL ] CALL
  335. 3350  LOCATE RO+6,CO:PRINT"MOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTORSOUNDSOUNDSOUNDMOTOR
  336. 3360  LOCATE RO+7,CO:PRINT"  C   D   E   F   G   A   B   C   D   E   F   G  "
  337. 3370  LOCATE RO+2,CO-10:PRINT " Rest: [1]"
  338. 3380  LOCATE RO+10
  339. 3390  COLOR 7,0
  340. 3400  PRINT " To play a note, press the number/letter ";
  341. 3410  PRINT "on any piano key in the diagram."
  342. 3420  PRINT
  343. 3430  PRINT " To play a rest press [1]."
  344. 3440  PRINT
  345. 3450  PRINT " To return to menu press SPACE BAR "
  346. 3460  PLAY"t255L64ml"
  347. 3470  FOR Z=1 TO 21:A=ASC(A$(Z)):AB$(A,2)=B$(Z):NEXT Z
  348. 3480  Z$=INKEY$:IF Z$=""THEN 3480
  349. 3490  IF Z$=" "THEN 4500
  350. 3500  A=ASC(Z$)
  351. 3510  Q$=INKEY$:IF Q$=""THEN PLAY AB$(A,2):GOTO 3510
  352. 3520  Z$=Q$:GOTO 3490
  353. 3530  PLAY AB$(A,2):GOTO 3480
  354. 3540  '
  355. 3550  '.....continuous range of tones
  356. 3560  CLS
  357. 3570  COLOR 15,2:PRINT " CONTINUOUS RANGE OF TONES "
  358. 3580  COLOR 1,0:PRINT LU$;
  359. 3590  COLOR 7,0
  360. 3600  GOSUB 4350
  361. 3610  PRINT UL$;
  362. 3620  PRINT "     The computer's range is from 32767 Hz. to 37 Hz."
  363. 3630  PRINT UL$;
  364. 3640  INPUT "     ENTER: At what frequency do you want to start";X
  365. 3650  IF X>=37 AND X<=32767 THEN 3670
  366. 3660  LOCATE CSRLIN-1:PRINT E$;:LOCATE CSRLIN-1:GOTO 3640
  367. 3670  VIEW PRINT 3 TO 24:CLS:VIEW PRINT
  368. 3680  '
  369. 3690  '.....start tone
  370. 3700  LOCATE 5:PRINT " Press any key to halt
  371. 3710  LOCATE 3:PRINT " Audio frequency (Hz.)=
  372. 3720  N=X/10:A=EXP(LOG(37/X)/N)
  373. 3730   FOR Z=1 TO N
  374. 3740    IF INKEY$<>""THEN 3840
  375. 3750    Y=X*A^Z
  376. 3760    LOCATE 3,24:PRINT CINT(Y)
  377. 3770    SOUND Y,1
  378. 3780   NEXT Z
  379. 3790    LOCATE 3,24:PRINT " 37"
  380. 3800    SOUND 37,25
  381. 3810  PRINT
  382. 3820  PRINT " THAT's as low as the computer goes!":PRINT:GOTO 3940
  383. 3830  '
  384. 3840  SOUND Y,25    'sustain tone for short time
  385. 3850  LOCATE 5,1
  386. 3860  PRINT " Press <1> to continue"
  387. 3870  PRINT
  388. 3880  PRINT " Press <0> to quit    "
  389. 3890  Y$=INKEY$
  390. 3900  IF Y$="1"OR Y$="0"THEN VIEW PRINT 4 TO 24:CLS:VIEW PRINT
  391. 3910  IF Y$="1"THEN X=Y:GOTO 3700
  392. 3920  IF Y$="0"THEN LOCATE 5:GOTO 3940
  393. 3930  GOTO 3890
  394. 3940  PRINT " Press <1> to run again"
  395. 3950  PRINT
  396. 3960  PRINT " Press <0> to return to menu"
  397. 3970  Z$=INKEY$
  398. 3980  IF Z$="1"THEN 3560
  399. 3990  IF Z$="0"THEN 4500
  400. 4000  IF Y=37 THEN SOUND Y,3
  401. 4010  GOTO 3970
  402. 4020  '
  403. 4030  '.....tone generator
  404. 4040  CLS
  405. 4050  COLOR 15,2:PRINT " TONE GENERATOR "
  406. 4060  COLOR 1,0:PRINT LU$;
  407. 4070  COLOR 7,0
  408. 4080  GOSUB 4350     'warning
  409. 4090  PRINT UL$;
  410. 4100  GOTO 4160
  411. 4110  '
  412. 4120  INPUT "     ENTER: Frequency (between 37Hz and 32767Hz)=";F
  413. 4130  IF F>=37 AND F<=32767 THEN RETURN
  414. 4140  LOCATE 3:PRINT E$;:LOCATE 3:GOTO 4120
  415. 4150  '
  416. 4160  GOSUB 4120:F1=F:F2=F
  417. 4170  PRINT:PRINT "     Do you want to generate a second tone?  (y/n)
  418. 4180  Z$=INKEY$:IF Z$="n"THEN 4210
  419. 4190  IF Z$="y"THEN PRINT:GOSUB 4120:F2=F:GOTO 4210
  420. 4200  GOTO 4180
  421. 4210  FOR Z=3 TO CSRLIN-1:LOCATE Z:PRINT E$;:NEXT Z:LOCATE 3
  422. 4220  IF F1=F2 THEN Z$=""ELSE Z$="1"
  423. 4230  PRINT "     Tone ";Z$;" =";F1;"Hz."
  424. 4240  IF F2=F1 THEN 4270
  425. 4250  PRINT "     Tone ";"2 =";F2;"Hz."
  426. 4260  LOCATE CSRLIN-1,25:PRINT "Tones are at 1/2 Second intervals
  427. 4270  PRINT UL$;
  428. 4280  PRINT "     Press any key to stop....."
  429. 4290  Z$=INKEY$
  430. 4300  IF Z$<>""THEN 4500
  431. 4310  SOUND F1,9.1
  432. 4320  SOUND F2,9.1
  433. 4330  GOTO 4290
  434. 4340  '
  435. 4350  '.....warning
  436. 4360  COLOR 12,0:T=6
  437. 4370  PRINT TAB(T);
  438. 4380  PRINT "WARNING! If you can't hear some of the high frequency tones you"
  439. 4390  PRINT TAB(T);
  440. 4400  PRINT "generate don't blame your computer - it's probably because you are"
  441. 4410  PRINT TAB(T);
  442. 4420  PRINT "either getting long in the tooth or have spent too much of your"
  443. 4430  PRINT TAB(T);
  444. 4440  PRINT "mis-spent youth listening to cranked-up Rock'n'Roll."
  445. 4450  COLOR 7,0
  446. 4460  RETURN
  447. 4470  '
  448. 4480  '.....end
  449. 4490  GOSUB 4720
  450. 4500  CLS:ERASE W$,N$,C$,AB$,X,Q$,A$,B$:RESTORE:GOTO 10
  451. 4510  '
  452. 4520  '.....data
  453. 4530  DATA "C ","C#/DERROR","D ","D#/EERROR","E ","F "
  454. 4540  DATA "F#/GERROR","G ","G#/AERROR","A ","A#/BERROR","B "
  455. 4550   FOR Z=1 TO 12:READ N$(Z):NEXT Z               'names of keys
  456. 4560  '
  457. 4570  DATA maj,6,7,maj 7,dim,aug,min,min 6,min 7
  458. 4580   FOR Z=1 TO 9:READ C$(Z):NEXT Z                'names of chords
  459. 4590  '
  460. 4600  DATA 10,11,23,34,44,53,61,68,74
  461. 4610   FOR Z=1 TO 9:READ X(Z):NEXT Z                 'location of frets
  462. 4620  '
  463. 4630  DATA (1)  E,(2)  B,(3)  G,(4)  D,(5)  A,(6)  E,(7)  Stop sound,(8)  EXIT
  464. 4640   FOR Z=1 TO 8:READ Q$(Z):NEXT Z                'guitar strings menu
  465. 4650  '
  466. 4660  DATA q,o2c,2,o2c+,w,o2d,3,o2d+,e,o2e,r,o2f,5,o2f+,t,o2g,6,o2g+,y,o2a
  467. 4670  DATA 7,o2a+,u,o2b,i,o3c,9,o3c+,o,o3d,0,o3d+,p,o3e,[,o3f,=,o3f+,],o3g
  468. 4680  DATA " ",p64
  469. 4690   FOR Z=1 TO 21:READ A$(Z),B$(Z):NEXT Z         'keyboard notes
  470. 4700  RETURN
  471. 4710  '
  472. 4720  'HARDCOPY
  473. 4730  GOSUB 4840:LOCATE 25,2:COLOR 14,6
  474. 4740  PRINT " Press 1 to print screen, 2 to print screen & ";
  475. 4750  PRINT "advance paper, or 3 to continue.";:COLOR 7,0
  476. 4760  Z$=INKEY$:IF Z$="3"THEN GOSUB 4840:RETURN
  477. 4770  IF Z$="1"OR Z$="2"THEN GOSUB 4840:GOTO 4790
  478. 4780  GOTO 4760
  479. 4790  FOR QX=1 TO 24:FOR QY=1 TO 80
  480. 4800  LPRINT CHR$(SCREEN(QX,QY));
  481. 4810  NEXT QY:NEXT QX
  482. 4820  IF Z$="2"THEN LPRINT CHR$(12)
  483. 4830  GOTO 4730
  484. 4840  LOCATE 25,1:PRINT STRING$(80,32);:RETURN
  485.